package main
import "fmt"

type Myint int

//本质上就是为内置类型增添了一个Less方法
func (a Myint) Less(b Myint) bool {
	return a < b
}

//左边的类型是表示方法要被作用的类型
func (a *Myint) Add(b Myint) {
	*a += b
}

func callCustomFunc() {
	var a Myint = 1
	if a.Less(2) {
		fmt.Println(a, "less than 2")
	}
	a.Add(2)
	fmt.Println("a=",a)
}

func valueAndReference() {
	/* array is 值语义，要修改得用指针 */
	var a = [3]int{1,2,3}
	var b = a
	b[1]++
	fmt.Println(a,b)
	var c = &a
	c[1]++
	fmt.Println(a,*c)

	//自定义一个引用类型
	type IntegerRef struct {
		impl *int
	}

	type Rect struct {
		x,y float64
		width,height float64
	}
	/*
	calRectArea := func()(func (r *Rect) Area() float64) {
		return r.width * r.height
	}()*/
	r1 := new(Rect)
	r2 := &Rect{}
	r3 := &Rect{0,0,100,200}
	r4 := &Rect{width:100,height:290}
	fmt.Println(r1,r2,r3,r4)
}

func main() {
	valueAndReference()
	//callCustomFunc()
}